import {onBeforeUnmount, onMounted, ref} from 'vue'
import EventBus from '/@/event-bus/'
import {DRC_METHOD, DRCDelayTimeInfo, DRCHsiInfo, DRCOsdInfo, DrcResponseInfo,} from '/@/types/drc'

export function useDroneControlMqttEvent(sn: string) {
    const drcInfo = ref('')
    const hsiInfo = ref('')
    const osdInfo = ref('')
    const delayInfo = ref('')
    const errorInfo = ref('')

    function handleHsiInfo(data: DRCHsiInfo) {
        hsiInfo.value = `method: ${DRC_METHOD.HSI_INFO_PUSH}\r\n ${JSON.stringify(data)}\r\n `
    }

    function handleOsdInfo(data: DRCOsdInfo) {
        osdInfo.value = `method: ${DRC_METHOD.OSD_INFO_PUSH}\r\n ${JSON.stringify(data)}\r\n `
    }

    function handleDelayTimeInfo(data: DRCDelayTimeInfo) {
        delayInfo.value = `method: ${DRC_METHOD.DELAY_TIME_INFO_PUSH}\r\n ${JSON.stringify(data)}\r\n `
    }

    function handleDroneControlErrorInfo(data: DrcResponseInfo) {
        if (!data.result) {
            return
        }
        errorInfo.value = `Drc error code: ${data.result}, seq: ${data.output?.seq}`
    }

    function handleDroneControlMqttEvent(payload: any) {
        if (!payload || !payload.method) {
            return
        }

        switch (payload.method) {
            case DRC_METHOD.HSI_INFO_PUSH: {
                handleHsiInfo(payload.data)
                break
            }
            case DRC_METHOD.OSD_INFO_PUSH: {
                handleOsdInfo(payload.data)
                break
            }
            case DRC_METHOD.DELAY_TIME_INFO_PUSH: {
                handleDelayTimeInfo(payload.data)
                break
            }
            case DRC_METHOD.DRONE_EMERGENCY_STOP:
            case DRC_METHOD.DRONE_CONTROL: {
                handleDroneControlErrorInfo(payload.data)
                break
            }
        }
        drcInfo.value = hsiInfo.value + osdInfo.value + delayInfo.value
    }

    onMounted(() => {
        EventBus.on('droneControlMqttInfo', handleDroneControlMqttEvent)
    })

    onBeforeUnmount(() => {
        EventBus.off('droneControlMqttInfo', handleDroneControlMqttEvent)
    })

    return {
        drcInfo: drcInfo,
        errorInfo: errorInfo
    }
}
